package edu.pmfbl.mnr.sem.mcmatp.app;

import com.borland.dbswing.*;
import com.borland.dx.dataset.*;
import com.borland.dx.sql.dataset.*;
import com.borland.dx.dataset.DataModule;

/**
 * <p>Title: MCMA Test Preview</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2009</p>
 *
 * <p>Company: KrndijaSoft</p>
 *
 * @author Ninoslav Krndija
 * @version 1.0
 */
public class AppDataModule implements DataModule
{
  /**
   * Data module referenca.
   */
  private static AppDataModule appDataModule = null;

  /**
   * URL za konekciju na JDBC server baza podataka. Icijalizuje se preko
   * static setJDBCDataSource() metode.
   */
  static String jdbcURL;

  /**
   * Korisnicko ime za konekciju na JDBC server baza podataka. Icijalizuje se preko
   * static setJDBCDataSource() metode.
   */
  static String jdbcUser;

  /**
   * Password za konekciju na JDBC server baza podataka. Icijalizuje se preko
   * static setJDBCDataSource() metode.
   */
  static String jdbcPassword;

  /**
   * Ime drajvera za konekciju na JDBC server baza podataka. Icijalizuje se preko
   * static setJDBCDataSource() metode.
   */
  static String jdbcDriver;

  Database database = new Database();

  QueryDataSet pitanjaDataSet = new QueryDataSet();
  QueryDataSet odgovoriDataSet = new QueryDataSet();

  /**
   * DataModule constructor.
   */
  public AppDataModule()
  {
    try
    {
      jbInit();
    }
    catch(Exception exception)
    {
      exception.printStackTrace();
    }
  }

  /**
   * Inicijalizacija.
   *
   * @throws java.lang.Exception
   */
  private void jbInit() throws Exception
  {
    // Eksplicitno ucitavanje klase za JDBC Driver
    Class.forName(/*"com.mysql.jdbc.Driver"*/jdbcDriver);
    database.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor(
        jdbcURL, jdbcUser, jdbcPassword, false, ""));

    pitanjaDataSet.addNavigationListener(new AppDataModule_pitanjaDataSet_navigationHandler(this));
    providePitanja();
  }

  /**
   * Vraca referencu na DataModule.
   *
   * @return referenca na DataModule
   */
  public static AppDataModule getDataModule()
  {
    if(appDataModule == null)
      appDataModule = new AppDataModule();

    return appDataModule;
  }

  public static void setJDBCDataSource(String URL, String user, String password, String driver)
  {
    if(appDataModule == null)
    {
      jdbcURL = URL;
      jdbcUser = user;
      jdbcPassword = password;
      jdbcDriver = driver;
    }
  }

  public com.borland.dx.sql.dataset.QueryDataSet getPitanjaDataSet()
  {
    return pitanjaDataSet;
  }

  public com.borland.dx.sql.dataset.QueryDataSet getOdgovoriDataSet()
  {
    return odgovoriDataSet;
  }

  public void locatePitanje(String key, long value)
  {
    DataRow locateRow = new DataRow(pitanjaDataSet, key);
    locateRow.setLong(key, value);
    pitanjaDataSet.locate(locateRow, Locate.FIRST);
  }

  public void locateOdgovor(String key, long value)
  {
    DataRow locateRow = new DataRow(odgovoriDataSet, key);
    locateRow.setLong(key, value);
    odgovoriDataSet.locate(locateRow, Locate.FIRST);
  }

  public void providePitanja()
  {
    pitanjaDataSet.close();
    pitanjaDataSet.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database,
        "SELECT * FROM mcma_pitanja group by rand()", null, true, Load.ALL));
    pitanjaDataSet.executeQuery();
  }

  // Poziva se nakon svake navigacije u pitanjaDataSet
  void pitanjaDataSet_navigated() throws DataSetException
  {
    ParameterRow odgovoriDataSetQueryParameters = new ParameterRow();
    odgovoriDataSetQueryParameters.addColumn("id", Variant.LONG);
    odgovoriDataSetQueryParameters.setLong("id", pitanjaDataSet.getLong("id"));
    odgovoriDataSet.close();
    if(pitanjaDataSet.getBoolean("mijesanjeodgovora"))
    {
      odgovoriDataSet.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database,
          "SELECT id, pitanje, odgovor, tacan, info FROM mcma_odgovori WHERE pitanje = :id group by rand()",
          odgovoriDataSetQueryParameters, true, Load.ALL));
    }
    else
      odgovoriDataSet.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database,
          "SELECT id, pitanje, odgovor, tacan, info FROM mcma_odgovori WHERE pitanje = :id",
          odgovoriDataSetQueryParameters, true, Load.ALL));
    odgovoriDataSet.executeQuery();
  }

}

class AppDataModule_pitanjaDataSet_navigationHandler implements com.borland.dx.dataset.NavigationListener
{
  AppDataModule adaptee;

  AppDataModule_pitanjaDataSet_navigationHandler(AppDataModule adaptee)
  {
    this.adaptee = adaptee;
  }

  public void navigated(NavigationEvent event)
  {
    adaptee.pitanjaDataSet_navigated(/*event.getDataSet*/);
  }
}
